#ifndef SOCK5_CONNECTOR_HPP
#define SOCK5_CONNECTOR_HPP

#include "connectevent.hpp"

namespace oraysock5 {
class Sock5Client;
/**
 * @brief 远端服务器连接器
*/
class Connector : public ConnectEvent {
public:
    /**
     * @brief 构造
     * @param connect_addr 远端服务器地址
    */
    explicit Connector(std::shared_ptr<IPAddress> connect_addr);
    ~Connector();

    /**
         * @brief 连接成功回调
        */
    void success() override;

    /**
         * @brief socket数据已经保存到管理io缓冲,可以读取回调
         * @return 返回SUCCESS正常没有操作,
         返回INITIATIVE_CLOSE服务器将关闭底层socket，并触发close(CLIENT_CLOSE)
         返回PASSIVE_CLOSE服务器将关闭底层socket，并触发close(SERVER_CLOSE)
        */
    InputResult input() override;

    /**
     * @brief 与log服务器断开连接回调
     * @param active 连接断开原因
    */
    void close(CloseType active) override;

    /**
         * @brief 检测到与服务器没有心跳超时回调
         * @param active 断开原因 TIMEOUT_CLOSE
        */
    void timerout(CloseType active) override;

    /**
         * @brief 设置管理io缓冲
         * @param iobuf 管理io缓冲 
        */
    void set_iobuf(std::shared_ptr<EventBuffer> iobuf)
    {
        iobuf_ = iobuf;
    }

    /**
     * @brief 获取管理io缓冲
     * @return 管理io缓冲
    */
    std::shared_ptr<EventBuffer> iobuf() const
    {
        return iobuf_;
    }

    void set_client(std::weak_ptr<Sock5Client> cli)
    {
        sock5client_ = cli;
    }

private:
    /**
     * @brief 连接断开原因
    */
    CloseType active_ = CloseType::SERVER_CLOSE;
    /**
     * @brief 接收服务器数据管理io缓冲处理
    */
    std::shared_ptr<EventBuffer> iobuf_;
    /**
     * @brief 关联的sock5客户端
    */
    std::weak_ptr<Sock5Client> sock5client_;
};
}

#endif
